// SessionFriendArea.h
// Created by Limou on 24-8-14.
//

#ifndef FRONTEND_SESSIONFRIENDAREA_HPP
#define FRONTEND_SESSIONFRIENDAREA_HPP

#include <QScrollArea>
#include <QScrollBar>
#include <QVBoxLayout>
#include <QPushButton>
#include <QGridLayout>
#include <QLabel>
#include <QStyleOption>
#include <QPainter>
#include "../../common/Common.hpp"
#include "./SessionFriendItem.hpp"

// >>> class SessionFriendArea begin: 普通滚动区域组件类 >>>
namespace chat_system::subassembly {
    class SessionFriendArea : public QScrollArea { // NOTE: QScrollArea 滚动区可以根据其子部件的大小自动添加水平和垂直滚动条, 例如添加布局的子元素
    Q_OBJECT

    private:
        QWidget *container_; // 滚动内容
        QVBoxLayout *layout_; // 滚动内容的布局管理

    public:
        // 构造方法
        explicit SessionFriendArea(QWidget *parent = nullptr)
                : QScrollArea(parent)
                , container_(new QWidget(this))
                , layout_(new QVBoxLayout(container_)) {
            this->setElement(); // 设置组件
            this->setElementStyle(); // 设置组件样式
            this->setElementLayout(); // 设置组件布局
            this->setElementSignalSlot(); // 设置信号槽
        }

        // 析构方法
        ~SessionFriendArea() override = default;

        // 添加一个 item(这里的 itemType 和 id 根据具体类型而定)
        void addItem(
            const common::SessionFriendItemType &itemType,
            const QString &id,
            const QIcon &avatar,
            const QString &name,
            const QString &text
        ) {
            if (itemType == common::SessionFriendItemType::SESSION_ITEM_TYPE) {
                auto item = new SessionItem(this, id, avatar, name, text);
                connect(item, &SessionItem::SessionItemIsClicked, this, [this](const QString& chatSessionId){
                    emit this->SessionItemIsClicked(chatSessionId);
                });
                container_->layout()->addWidget(item);
            } else if (itemType == common::SessionFriendItemType::FRIEND_ITEM_TYPE) {
                auto item = new FriendItem(this, id, avatar, name, text);
                container_->layout()->addWidget(item);
            } else if (itemType == common::SessionFriendItemType::APPLY_FOR_ITEM_TYPE) {
                auto item = new ApplyForItem(this, id, avatar, name);
                container_->layout()->addWidget(item);
            } else {
                common::Tools::getInstance()->getLogger()->error("addItem(): ItemType is an unknown type");
            }
        }

        // 使用下标来模拟鼠标选中
        void clickItem(int index) {
            if (index < 0 || index >= container_->layout()->count()) {
                common::Tools::getInstance()->getLogger()->error("clickItem(): index is out of range.");
                return;
            }

            auto layoutItem = container_->layout()->itemAt(index);
            if (layoutItem == nullptr || layoutItem->widget() == nullptr) {
                common::Tools::getInstance()->getLogger()->error("clickItem(): This element does not exist.");
                return;
            }

            SessionFriendItem *item = dynamic_cast<SessionFriendItem *>(layoutItem->widget());
            item->highlight();
        }

        // 清理所有 item
        void clearItem() {
            TODO("或许有严重的释放问题");
            auto layout = container_->layout();
            for (int i = layout->count() - 1; i >= 0; --i) { // NOTE: 不能使用  size_t 替代 int, 一般开发也不建议使用无符号, 这是早期的无奈方案
                auto item = layout->takeAt(i);
                if (item->widget()) {
                    delete item->widget(); // NOTE: 由于多态原因, 这里的析构不会造成内存泄漏, 只要 Qt 的组件对析构进行了虚函数处理即可
                }
            }
        }

    signals:
        void SessionItemIsClicked(const QString& chatSessionId);

    private:
        // 设置组件方法
        void setElement() {
            // 设置滚动区域和滚动条
            this->setWidgetResizable(true); // NOTE: 设置 Widget 可调整大小后才可以开启滚动效果
            // 让滚动区域包含一个可变长的 QWidget 组件
            this->setWidget(container_); // TODO: 这里应该就会导致 OriginalContainer_ 变成 SessionFriendArea 对象
        }

        // 设置组件样式方法
        void setElementStyle() {
            this->setStyleSheet("QScrollArea { border: none; }");
            this->verticalScrollBar()->setStyleSheet(
                    "QScrollBar:vertical {"
                    "width: 5px;"
                    "background-color: transparent;"
                    "}"
                    "QScrollBar::handle:vertical {"
                    "background: rgb(46, 46, 46);"
                    "}"
                    "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {"
                    "background: transparent;"
                    "}"
            );
            this->horizontalScrollBar()->setStyleSheet("QScrollBar:horizontal { height: 0px }"); // 选择垂直方向滚动条样式进行设置, 禁止显示垂直方向的滚动条
            container_->setStyleSheet("QWidget { border: none; } ");
        }

        // 设置组件布局方法
        void setElementLayout() {
            // 给 Widget 组件添加布局, 方便后续添加会话项
            layout_->setContentsMargins(0, 0, 0, 0);
            layout_->setSpacing(0);
            layout_->setAlignment(Qt::AlignTop);
            container_->setLayout(layout_);
        }

        // 设置信号槽
        void setElementSignalSlot() {

        }
    }; // class SessionFriendArea end
} // namespace chat_system::subassembly end
// <<< class SessionFriendArea end <<<

#endif // FRONTEND_SESSIONFRIENDAREA_HPP
